package com.atxiaodei.nio.nioday01;

import org.junit.Test;

import java.util.Arrays;
import java.util.List;
import java.util.function.Function;
import java.util.function.Predicate;

import static java.util.stream.Collectors.toList;

/**
 * @author wangmeng
 * @date 2020/9/12
 **/
public class StreamApi1 {

    @Test
    public void test1(){
        /**
         * Java Stream函数式编程接口最初是在Java 8中引入的，并且与lambda一起成为Java开发的里程碑式的功能特性，
         * 它极大的方便了开放人员处理集合类数据的效率。从笔者之前看过的调查文章显示，绝大部分的开发者使用的JDK版本是java 8，其中Java Stream和lambda功不可没。
         *
         * Java Stream就是一个数据流经的管道，并且在管道中对数据进行操作，然后流入下一个管道。有学过linux 管道的同学应该会很容易就理解。
         * 在没有Java Stram之前，对于集合类的操作，更多的是通过for循环。大家从后文中就能看出Java Stream相对于for 循环更加简洁、易用、快捷。
         *
         * 管道的功能包括：Filter（过滤）、Map(映射)、sort(排序）等，集合数据通过Java Stream管道处理之后，转化为另一组集合或数据输出
         */
        // Stream API代替for循环

        // 我们先来看一个例子 取出一个list中L开头的字符串 并转为大写  返回到新的结合
            List<String> list = Arrays.asList("Monkey", "Lion", "Giraffe", "Lemur");
            //一、 先简单化 运用匿名内部类 实现  主要目的是看看Stream 内部结构方便以后学习 collect(toList())是将流转换成集合的
            List<String> list1 = list.stream()
                    .filter(new Predicate<String>() {
                        @Override
                        public boolean test(String s) {
                            return s.startsWith("L");
                        }
                    }).map(new Function<String, String>() {
                        @Override
                        public String apply(String s) {
                            return s.toUpperCase();
                        }
                    }).sorted().collect(toList());
            System.out.println(list1);
            // 二、一气呵成 结合lamdba完成
            list.stream()
                    .filter(s -> s.startsWith("L"))
                    .map(String::toUpperCase)
                    .sorted()
                    .collect(toList())
                    .forEach(System.out::println);
        }

        /**
         *              总结结论
         * 首先，我们使用Stream()函数，将一个List转换为管道流
         * 调用filter函数过滤数组元素，过滤方法使用lambda表达式，以L开头的元素返回true被保留，其他的List元素被过滤掉
         * 然后调用Map函数对管道流中每个元素进行处理，字母全部转换为大写
         * 然后调用sort函数，对管道流中数据进行排序
         * 最后调用collect函数toList，将管道流转换为List返回
         */

}
